import org.junit.Test;

import java.nio.ByteBuffer;

/**
 * @author liweimin
 * @date 2020/10/16 15:15
 * @description 缓冲区 ：Java　NIO中负责数据的获取 用于存储不同的数据 除了boolean
 * <p>
 * mark: 标记当前position的位置，可以通过Reset恢复到mark的位置
 */
public class TestBuffer {
    @Test
    public void test01() {
        //分配指定大小的缓冲区
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        String str = "lwmzzz";
        byte[] bytes = str.getBytes();
        //写入数据
        buffer.put(bytes);
        System.out.println(buffer.limit());
        System.out.println(buffer.mark());
        System.out.println(buffer.capacity());
        System.out.println(buffer.position());
        //切换到读取数据模式
        /**
         * limit = position;
         * position = 0;
         */
        buffer.flip();
        byte[] bytes1 = new byte[buffer.limit()];
        buffer.get(bytes1);
        String s = new String(bytes1);
        System.out.println(s);
        /**
         * 可重复读
         * 复位 position
         */
        buffer.rewind();

        /**
         * 清空缓冲区----------》复位标识符 不实际删除数据，数据仍然存在---->“被遗忘”
         * buff.clear()-----> position = 0; limit = capacity;
         */
        buffer.clear();
    }

    @Test
    public void test02() {
        String str = "qwert";
        ByteBuffer buffer = ByteBuffer.allocate(1024);
        buffer.put(str.getBytes());
        buffer.flip();
        byte[] bytes = new byte[buffer.limit()];
        buffer.get(bytes);
        System.out.println(buffer.mark());
        buffer.rewind();
        byte[] bytes1 = new byte[buffer.limit()];
        buffer.get(bytes1, 0, 3);
        //进行标记
        buffer.mark();
        System.out.println(buffer.position());
        buffer.get(bytes1, 3, 2);
        System.out.println(buffer.position());
        buffer.reset();
        System.out.println(buffer.position());
        //可操作的数据的数量
        buffer.remaining();
        //是否还有剩余的数据
        buffer.hasRemaining();
    }
    @Test
    public void test03(){
        /**
         * 非直接缓冲区： JVM内存中allocate
         * 直接缓冲区：   将缓冲区建立在操作系统的物理内存中allocateDirect 消耗资源大 不由JVM控制 由操作系统接管
         */
        ByteBuffer buffer = ByteBuffer.allocateDirect(1024);
    }
}
